#include <iostream>
#include <fstream>
#include <cstring> //permet d'utiliser strstr

using namespace std;

//cin.ignore();
//getline(cin,def);
struct entmot
{
    string mot;
    string def;
    
};

struct rechmot
{
bool existe;
entmot res;
int numcase;
};


void ajoutDef(entmot dico[] ,int dernmot[]);
void supDef (entmot dico[] ,int dernmot[]);
void affDef (entmot dico[] ,int dernmot[]);
void modDef (entmot dico[] ,int dernmot[]);
void videtableau(entmot dico[] , int taille);
rechmot cherchmot (entmot dico[] ,int dernmot[],string mot);
void loadData(entmot dico[] , int dernmot[]);
void ecriData(entmot dico[] , int dernmot[]);
void rechPart (entmot dico[] , int dernmot[]);
void tabrechpartiel(rechmot dico[] , int taille);
void partiel (entmot dico[] , int dernmot[]);
void affDico (entmot dico[] , int taille);

int main(){
cout<<"Dictionnaire MACHETTE \n";
cout<<"BREMOND Maxime et GANTIER Jimmy\n";


int dernmot[1];//Pour avoir en memoire le nombre de mots

int menuchoix=0;
const int dicosize = 2000;
entmot dico [dicosize];
videtableau (dico, dicosize);
loadData(dico , dernmot);

while(menuchoix!=7)
	{
	cout<<"Pour ajouter une definition appuyez sur la touche 1.\n";
	cout<<"Pour supprimer une definition appuyez sur la touche 2.\n";
	cout<<"Pour afficher une definition appuyez sur la touche 3.\n";
	cout<<"Pour modifier une definition appuyez sur la touche 4.\n";
	cout<<"Pour afficher tous les mots appuyez sur la touche 5.\n";
	cout<<"Pour faire une rechercher partiel appuyez sur la touche 6.\n";
	cout<<"Pour quitter le programme appuyez sur la touche 7.\n";
	cin>>menuchoix;
	switch (menuchoix)
		{
		case 1:
		cout << string(50, '\n');
		ajoutDef(dico , dernmot);
		break;
		case 2:
		cout << string(50, '\n');
		supDef(dico , dernmot);
		break;
		case 3:
		cout << string(50, '\n');
		affDef(dico , dernmot);
		break;
		case 4:
		cout << string(50, '\n');
		modDef(dico , dernmot);
		break;
		case 5:
		cout << string(50, '\n');
		affDico (dico , dernmot[0]);
		break;
		case 6:
		cout << string(50, '\n');
		partiel (dico , dernmot);
		break;
		case 7:
		cout << string(50, '\n');
		ecriData(dico , dernmot);
		break;
		default:
		cout<<"Try again";
		break;
		}
	}
return 0;
}


void videtableau(entmot dico[] , int taille)
{
    for (int i=0 ; i < taille ; i++)
    {
        dico[i].mot="";
        dico[i].def="";
    }
}

void ajoutDef(entmot dico[] ,int dernmot[])
{
    entmot entrnew;
    rechmot resultat;
cout<< dernmot[0];
    cout << "\nEntrez un mot: ";
    cin >> entrnew.mot;


    resultat = cherchmot(dico , dernmot , entrnew.mot); 
    if (!resultat.existe)
    {
        cout << "\nDefinition du mot:";
        cin.ignore(); 
        getline(cin , entrnew.def);
        dico[dernmot[0]] = entrnew;
        dernmot[0]=dernmot[0]+1;
        cout << "\nMot enregistre.\n";
    }
    else
    {
        cout << "\nLe mot existe deja\n";
    }

}


void affDef(entmot dico[] ,int dernmot[])
{
    string mot;
    rechmot resultat;
    cout << "\nDe quel mot voulez vous afficher la definition\n";
    cin >> mot;
    resultat = cherchmot(dico , dernmot , mot);
    if (resultat.existe)
    {
        cout << "\n" << resultat.res.mot << " : " << resultat.res.def << endl;
    }
    else
    {
        cout << "\n Le mot demande n'existe pas.\n";
        /*

        */
    }
}


void supDef(entmot dico[] ,int dernmot[])
{
    string mot;
    rechmot resultat;
    cout << "\nQuel mot voulez-vous supprimer?\n";
    cin >> mot;
    resultat = cherchmot(dico , dernmot , mot);
    if (resultat.existe)
    {
        dico[resultat.numcase].def = "";
        dico[resultat.numcase].mot = "";
        cout << "\nLa suppression est un succes\n";
        for (int i=0 ; i < dernmot[0] ; i++) 
        {
            if (dico[i].mot == "") 
            {
                
                dico[i].mot = dico[i+1].mot;
                dico[i].def = dico[i+1].def;
                dico[i+1].mot = "";
                dico[i+1].def = "";
            }

        }
        dernmot[0]=dernmot[0]-1; 
    }
    else
        cout << "\nLe mot n'existe pas ou plus\n";
}


void modDef(entmot dico[] ,int dernmot[])
{
    string mot;
    string nouvdef;
    rechmot resultat;
    cout << "\nDe quel mot voulez-vous modifier la definition?\n";
    cin >> mot;
    resultat = cherchmot(dico , dernmot , mot);
    if (resultat.existe)
    {
        cout << "\n" << resultat.res.mot << " : " << resultat.res.def << endl;
        cout << "\nNouvelle definition:\n";
        cin.ignore(); 
        getline(cin , nouvdef);
        dico[resultat.numcase].def = nouvdef;
        cout << "\ndefinition sauvegarde\n";

    }
    else
    {
        cout << "\n Le mot n'existe pas.\n";
    }
}

rechmot cherchmot (entmot dico[] ,int dernmot[],string mot)
{
rechmot resultat;
resultat.existe = false;
int cpt=0;

while ( resultat.existe == false && cpt < dernmot[0])
	{
	if (dico[cpt].mot == mot)
		{
		resultat.existe = true;
		resultat.numcase = cpt;
		resultat.res = dico[cpt];
		}
	else
		{
		cpt++;
		}
	}
return resultat;
}

void loadData(entmot dico[] ,int dernmot[])
{
    int i=0;

    ifstream fichierDico;
    fichierDico.open("dico.txt");

    if(fichierDico)
    {
        while(fichierDico)   
        {
            string mot;
            string def;
          
            getline(fichierDico, mot , '='); 
            getline(fichierDico, def); 
            dico[i].mot = mot; 
            dico[i].def = def; 
            if(fichierDico) 
                i++;
        }
        
        cout << "\nLe dictionnaire a " << i << " mots en memoire.\n";
        dernmot[0] = i;
        

    }
    else
    {
        cout << "\nERREUR: Impossible d'ouvrir \"dico.txt\" \n";
        cout << "\nLe programme va tenter de creer ce fichier\n";
        
        ofstream fluxDico; 
        fluxDico.open("dico.txt", ios::app); 
        if(fluxDico)
        {
            cout << "\nFichier cree avec succes\n";
            dernmot[0] = 0;
   
        }
        else 
        {
            cout << "\nLe fichier n'a pas ete cree, essayez en mode administrateur\n";
        }
        fluxDico.close(); 
    }
    fichierDico.close(); 


}

void ecriData(entmot dico[] ,int dernmot[])
{

    ofstream fichierDico;
    fichierDico.open("dico.txt"); 


    if (fichierDico)
    {
    
        for (int i=0 ; i < dernmot[0] ; i++) 
        {
            fichierDico << dico[i].mot << "=" << dico[i].def << endl;
         
        }

    }
    else
    {
        cout << "\nErreur\n\n";
    }
    fichierDico.close();
}

void tabrechpartiel(rechmot dico[] , int taille)
{
    for (int i=0 ; i < taille ; i++)
    {
        dico[i].existe = false;
        dico[i].res.mot = "";
        dico[i].res.def = "";
        dico[i].numcase = 0;
    }
}


void partiel(entmot dico[] , int dernmot[])
{

    rechmot tabpartiel[1000]; 
    tabrechpartiel(tabpartiel , 1000);
    string strecrit;
    cout << "\nEntrez une recherche partiels, tous les mots contenant ces lettres seront affiches\n";
    cin >> strecrit;
    int l=0;


    for ( int k=0 ; k < dernmot[0] ; k++)
    {
        if ( strstr ( dico[k].mot.c_str() , strecrit.c_str() ) ) 
        {
            tabpartiel[l].res = dico[k];
            l++; 
        }
    }
   if (l==0) 
	{
        cout << "\nAucun mot trouve\n";
	}
    else
    {
        cout << l << "\nles mots contenant cette chaine sont :\n";
        for (int m=0 ; m < l ; m++)
        {
            cout << tabpartiel[m].res.mot << " : " << tabpartiel[m].res.def<< endl;
        }
    }

}

void affDico (entmot dico[] , int taille)
{
    for (int i=0 ; i <= taille ; i++)
    {
        cout << dico[i].mot << endl;
    }
}
